*--------------------------------------------------------------; * Selects an ordered simple random sample without replacement ; * from a finite population stored in a SAS data set called ; * frame. Algorithm for selection requires that the ; * population size be known. ; * ; * Algorithm Reference: ; * Bissell, A. (1986). Ordered Random Selection without ; * replacement, Applied Statistics (JRSS-C), 35: 73-75 ; *--------------------------------------------------------------; %macro srs(noprint,frame=,setup=,npop=,n=,sample=,seed=); %if %length(&seed) = 0 %then %let seed = %str(0); %if %length(&sample) = 0 %then %let sample = %str(sample); %if %length(&npop) = 0 %then %let npop = %str(npop); %if %length(&n) = 0 %then %let n = %str(n); %if %length(&frame) = 0 %then %let frame = %str(frame); %if %length(&setup) > 0 %then %do; data &setup; set &setup; call symput('npop',trim(left(npop))); call symput('n',trim(left(n))); run; %end; data &sample; set &frame; retain nprime_ 0 pprime_ 1 rprime_ 0 u_ 0; if _n_ = 1 then do; nprime_ = &npop; rprime_ = &npop - &n; u_ = ranuni(&seed); pprime_ = pprime_*rprime_/nprime_; end; if pprime_ > u_ then do; rprime_ = rprime_ - 1; end; else do; output; pprime_ = 1; u_ = ranuni(&seed); end; nprime_ = nprime_ - 1; if nprime_ > 0 then pprime_ = pprime_*rprime_/nprime_; drop nprime_ pprime_ rprime_ u_ ; %if %length(&noprint) = 0 %then %do; proc print data = &sample; title1 "Simple Random Sample"; title2 "Output Data Set = &sample"; %end; run; title; %mend srs;